package service

import (
	"fmt"
	"gin/common/constant"
	"gin/common/util"
	"gin/common"
	"gin/common/db/config"
	commonLog "gin/common/log"
	sysEntity "gin/system/entity"
	sysUtil "gin/system/util"
	"github.com/gin-gonic/gin"
	"log"
)

func Login(c *gin.Context, loginBody *sysEntity.LoginBody) string {
	logger := commonLog.InitLogger()

	var resultList []map[string]interface{}

	//var resultTokenList = make(map[string]string)

	//参数接收
	userName := loginBody.UserName
	password := loginBody.Password

	//不为空校验传参
	if userName == "" {
		logger.Println(constant.LOGERR() + "用户名不能为空")
		common.ReturnError(c, constant.ERRORCODE(), util.MapToJson("用户名不能为空"), resultList, int64(len(resultList)))
		panic("")
	}

	if password == "" {
		logger.Println(constant.LOGERR() + "密码不能为空")
		common.ReturnError(c, constant.ERRORCODE(), util.MapToJson("密码不能为空"), resultList, int64(len(resultList)))
		panic("")
	}

	log.Println("用户输入的账号：" + userName)
	log.Println("用户输入的密码：" + password)
	//TODO 校验数据库中的  用户信息

	//从数据库中查询输入用户的信息
	sysUser := &sysEntity.LoginBody{}

	//取值 赋值
	sysUser.UserName = userName

	//查收过滤条件拼装
	//查询多条记录，Find函数返回的是一个数组
	err := config.GormDb.Model(&sysEntity.LoginBody{}).Table("sys_user ").Select("user_id as UserId", "user_name as UserName", "password as Password", "dept_id as DeptId").Where("LOWER(user_name) = LOWER(?)", userName).Scan(&resultList).Error
	if err != nil {
		logger.Println(constant.LOGERR() + "查询用户失败，原因：" + util.MapToJson(err))
		log.Println("查询用户失败，原因：", err)
	}

	if resultList == nil {
		logger.Println(constant.LOGERR() + "查询用户失败，原因： 查询用户失败，原因：数据库中没有查到   userName 叫 admin 的用户信息")
		common.ReturnError(c, constant.ERRORCODE(), util.MapToJson("查询用户失败，原因：数据库中没有查到   userName 叫 admin 的用户信息"), resultList, int64(len(resultList)))
		panic("")
	}

	//数据库中有数据进行后面操作
	userNameDB := ""
	passwordDB := ""
	deptIdDB := 0

	if len(resultList) > 0 {
		logger.Println(constant.LOGINFO() + "用户信息查询成功！！！！！，进行后续操作")
		//log.Println("用户信息查询成功！！！！！，进行后续操作")
		for _, item := range resultList {
			// 将集合中的值赋值给sysUser结构体的对应字段
			userNameDB = item["UserName"].(string)
			passwordDB = item["Password"].(string)
			//deptIdDB = item["DeptId"].(int)
			log.Println("数据库中的密码密文为：" + userNameDB + "=====" + passwordDB)
		}
	}

	//rsa解密 数据库中用户的密文密码
	plainText := []byte(passwordDB)

	plainText, err = sysUtil.RsaDecrypt(plainText, "./private.pem")
	if err != nil {
		logger.Println(constant.LOGERR() + "解密发生异常, 异常信息为：" + util.MapToJson(err))
		fmt.Println(err)
	}
	fmt.Printf("数据库密码解密后的明文为:%s\n", plainText)
	/*
		log.Println("====================用户输入的明文密码为：" + password)
		log.Println("====================数据库中查找到的密码解密后为：" + string(plainText))*/

	//数据库中的密码密文  解密后，与用户输入的  明文密码 进行比较
	if string(plainText) == password {
		logger.Println(constant.LOGINFO() + "您输入的密码正确, 密码校验通过!!!!")
		//log.Println("************************您输入的密码正确，密码校验通过！！！********************************")
	} else {
		//log.Println("************************您输入的密码错误，密码校验不通过！！！********************************")
		logger.Println(constant.LOGERR() + "您输入的密码错误, 密码校验不通过!!!!,异常信息为：" + util.MapToJson(err))
		common.ReturnError(c, constant.ERRORCODE(), util.MapToJson("登录失败，用户密码错误，请仔细检查"), resultList, int64(len(resultList)))
		panic("")
	}

	sysUser.UserName = userName
	sysUser.DeptId = deptIdDB
	sysUser.Password = string(plainText)
	//TODO 创建令牌
	token := CreateToken(c, userName, sysUser)

	//记录登录系统用户的信息写入磁盘，持久化记录
	logger.Println(constant.LOGINFO() + "用户名称为：" + sysUser.UserName + " 的用户登录成功登录系统！！！！")
	return token
}

//RSA加密解密测试验证
func Rsapassword(c *gin.Context, loginBody *sysEntity.LoginBody) []map[string]interface{} {
	var resultList []map[string]interface{}
	//参数接收
	//userName := loginBody.UserName
	//password := loginBody.Password

	//生成密钥对
	err := sysUtil.GenerateRsaKey(1024, "./")
	if err != nil {
		log.Println("==================生成密钥对发生异常")
		fmt.Println(err)
	}

	//加密
	plainText := []byte("123456")
	cipherText, err := sysUtil.RsaEncrypt(plainText, "./public.pem")
	if err != nil {
		fmt.Println(err)
		log.Println("==================加密发生异常")
	}
	fmt.Printf("加密后为:%s\n", cipherText)

	//解密
	plainText, err = sysUtil.RsaDecrypt(cipherText, "./private.pem")
	if err != nil {
		log.Println("==================解密发生异常")
		fmt.Println(err)
	}
	fmt.Printf("解密后为:%s\n", plainText)

	return resultList
}
